package com.java.java网络.exercise2;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * java网络通讯：socket的理解
 * 当我们访问一个网站时，浏览器会向服务器发送请求，服务器收到请求后，会返回一个响应，浏览器收到响应后，就会根据响应进行页面的渲染。
 * 当我们通讯时，客户端会向服务器发送请求，服务器收到请求后，会返回一个响应，客户端收到响应后，就会根据响应进行页面的渲染。
 * socket.getOutputStream()向服务器发送请求，socket.getInputStream()接收服务器的响应。客户端，服务端都是socket。
 * 属于Tcp编程模型
 * 服务器端：监听端口9999等待连接，接收客户端的请求，通过socket.getInputStream()读取客户端写入的数据，处理请求，返回响应。
 * 客户端：连接上服务器端的ip，连接上后生成socket通过socket.getOutputStream()向服务器发送请求，socket.getInputStream()接收服务器的响应。
 */
public class NetThreeS3 { // 服务端 字符流
    public static void main(String[] args) throws IOException {
        // 思路：
        // 1.在本机9999端口监听，等待连接---前提该端口没有被占用
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器端已启动，等待连接");
        // 2.当没有客户端连接9999端口时，程序会阻塞，等待连接
        // 如果有客户端连接，则会返回一个socket对象，程序继续
        Socket socket = serverSocket.accept();
        System.out.println("客户端连接成功" + socket.getClass());

        // 3.通过socket.getInputStream()读取客户端写入的数据
        InputStream inputStream = socket.getInputStream();

        // 附加需要使用转换流，将字节转换为字符流 inputStreamReader = InputStream -> Reader
        // 4.读取客户端写入的数据-使用字符流 （InputStreamReader转换流）
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();//设置结束标记 readLIne方法会自动关闭流
        System.out.println(s);

        // 5.字符流回发
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("hello,client-字符流");
        bufferedWriter.newLine();// 换行，表示回复内容结束否则接收不到、
        bufferedWriter.flush(); // 手动刷新

        // 6.关闭流
        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();
    }
}
